package logic

import (
	"errors"
	"github.com/spf13/viper"
	"go.uber.org/zap"
	"go_spider_api/dao/localos"
	"go_spider_api/dao/ssh"
)

func StartEsfZf(spiderList []string) (err error) {
	// 首先从 scrapyd查询对应的爬虫任务是否正在执行，如果正在执行，需要先杀死
	//fmt.Println(spiderList)

	err = KillEsfZf(spiderList)

	if err != nil {
		return
	}

	// 遍历预备执行的任务，如果pending中存在要执行的任务，则把此任务剔除
	spiderList = WithPendingGetList(spiderList)


	for _, spiderName := range spiderList {

		//err = StartSpider(spiderName)
		// 开启 goroutine

		err = StartSpider(spiderName)
		if err != nil {
			return
		}
		zap.L().Debug("===成功启动爬虫：" + spiderName + "===")

	}
	// 检验对应的爬虫是否成功启动？

	return

}


func WithPendingGetList(spiderList []string) []string {
	jobMap := GetJobs()

	for _, val := range jobMap.Pending {
		for index, spiderName := range spiderList {
			if val.Spider == spiderName {
				//fmt.Printf("准备杀死爬虫：%s\n", val.Spider)
				//zap.L().Debug("===正在杀死爬虫===" + val.Spider)
				// 监测到对应爬虫正在运行
				// 通过 ssh 传输指令 杀死对应的爬虫
				//go ssh.KillEsfZf(val.Id)
				if index == len(spiderList) - 1 {
					spiderList = spiderList[:index]

				} else {
					spiderList = append(spiderList[:index], spiderList[index + 1:]...)

				}


			}
		}

	}
	return spiderList



}


func KillEsfZf(spiderList []string) (err error) {


	// 从服务器查询 spider任务列表
	jobMap := GetJobs()

	// 遍历列表，如果列表中的爬虫正在运行，取 jobid
	for _, val := range jobMap.Running {
		for _, spiderName := range spiderList {
			zap.L().Debug(spiderName)
			if val.Spider == spiderName {
				//fmt.Printf("准备杀死爬虫：%s\n", val.Spider)
				zap.L().Debug("===正在杀死爬虫===" + val.Spider)
				// 监测到对应爬虫正在运行
				// 通过 ssh 传输指令 杀死对应的爬虫
				//go ssh.KillEsfZf(val.Id)
				// 判断是否需要 ssh远程执行指令？
				if viper.GetString("app.dev") != "local" {
					err = ssh.KillEsfZf(val.Id)
					if err != nil {
						err = errors.New("通过ssh远程杀死对应爬虫报错！")
						return
					}

				} else {
					// 调用本地 linux 指令杀死指定爬虫任务
					err = localos.KillEsfZf(val.Id)

				}


			}
		}

	}
	//for _, val := range jobMap.Pending {
	//	for _, spiderName := range spiderList {
	//		if val.Spider == spiderName {
	//			//fmt.Printf("准备杀死爬虫：%s\n", val.Spider)
	//			zap.L().Debug("===正在杀死爬虫===" + val.Spider)
	//			// 监测到对应爬虫正在运行
	//			// 通过 ssh 传输指令 杀死对应的爬虫
	//			//go ssh.KillEsfZf(val.Id)
	//			err = ssh.KillEsfZf(val.Id)
	//			if err != nil {
	//				err = errors.New("通过ssh远程杀死对应爬虫报错！")
	//				return
	//			}
	//
	//		}
	//	}
	//
	//}
	// 检查需要关闭的爬虫是否全部成功杀死
	//jobMap = GetJobs()
	//
	//for _, val := range jobMap.Running {
	//	for _, spiderName := range spiderList {
	//		if val.Spider == spiderName {
	//			zap.L().Debug("===此爬虫未成功KILL===" + val.Spider)
	//			err = errors.New("未成功杀死爬虫！")
	//			return
	//
	//		}
	//	}
	//
	//}
	return
}
